----- IEEE-754 浮点 -----


单精度
/*--------------widget.h--------------*/
float IEEE754(quint16 reg1, quint16 reg2)
    // reg1:寄存器1,reg2:寄存器2
    
/*--------------widget.cpp--------------*/
float Widget::IEEE754(quint16 reg1, quint16 reg2)
{
    // 存储原始字节数据的容器(4字节)
    QVector rawBytes;
    
    // 拆分第 1 个寄存器(高2字节)
    uint8_t high1 = (reg1 >> 8) & 0xFF;
    uint8_t low1 = reg1 & 0xFF;
    rawBytes.append(high1);
    rawBytes.append(low1);
    
    // 拆分第 2 个寄存器(低2字节)
    uint8_t high2 = (reg2 >> 8) & 0xFF;
    uint8_t low2 = reg2 & 0xFF;
    rawBytes.append(high2);
    rawBytes.append(low2);
    
    // 确保有4字节数据
    if (rawBytes.size() != 4) {
        qDebug() << "数据错误,需要4字节才能转换为浮点数";
        return NAN;
    }
    
    // 转换为const uint8_t*(使用data()方法)
     const uint8_t* bytePtr = rawBytes.data();
    
    // 验证指针有效性
    if (bytePtr == nullptr) {
        throw std::invalid_argument("输入字节数组不能为空");
    }
    
    // 组合4字节为32位无符号整数(大端模式)
    uint32_t rawData = (static_cast(bytePtr[0]) << 24) |
        (static_cast(bytePtr[1]) << 16) |
        (static_cast(bytePtr[2]) << 8) |
        static_cast(bytePtr[3]);
    
    // 提取符号位 (第31位)
    const bool sign = (rawData & 0x80000000) != 0;
    
    // 提取符号位 (第31位)
    const uint8_t expBits = static_cast((rawData >> 23) & 0xFF);
    
    // 提取尾数位 (第0-22位)
    const uint32_t mantissaBits = rawData & 0x7FFFFF;
    
    // 处理特殊值情况
    if (expBits == 0xFF) {
        if (mantissaBits == 0) { return sign ? -INFINITY : INFINITY; }  // 无穷大
        else { return NAN; }  // 非数(NaN)
    }
    
    // 计算指数和尾数
    int32_t exponent; float mantissa;
    if (expBits == 0) {
        // 非规格化数
        exponent = -126;
        mantissa = static_cast(mantissaBits) / (1 << 23);
    } else {
        // 规格化数
        exponent = static_cast(expBits) - 127;
        mantissa = 1.0f + static_cast(mantissaBits) / (1 << 23);
    }
    
    // 计算最终结果
    float result = (sign ? -1.0f : 1.0f) * mantissa * std::pow(2.0f, exponent);
    
    return result;
}